[アップデート] Amzon Bedrock Agents の InvokeInlineAgent API がストリーミング生成をサポートしました

[アップデート] Amzon Bedrock Agents の InvokeInlineAgent API がストリーミング生成をサポートしました

Clock Icon2025.01.17

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

Amzon Bedrock Agents の InvokeInlineAgent API がストリーミング生成をサポートしました。

https://awsapichanges.com/archive/changes/a77c18-bedrock-agent-runtime.html

今まで対応していなかったストリーミング生成をサポートし、さらに使いやすくなったのではないでしょうか。

InvokeInlineAgent

InvokeInlineAgent API は Amazon Bedrock Agents を構築せずとも、 Agents の定義を API のパラメーターに含めることで Agents の機能を利用できる API です。InvokeInlineAgent API で実行する Agents は InlineAgent と呼ばれています。

https://docs.aws.amazon.com/bedrock/latest/userguide/agents-create-inline.html

アップデート内容

InvokeInlineAgent API に今回、新たに streamingConfigurations が追加され、ストリーミングの有無かう、 Amazon Bedrock Guardrails が当てられている場合に、チェックする文字数の間隔値を指定できるようになりました。

InvokeInlineAgent.json
client.invoke_inline_agent(
    actionGroups=[
        {
            'actionGroupExecutor': {
                'customControl': 'RETURN_CONTROL',
                'lambda': 'string'
            },
            'actionGroupName': 'string',
            'apiSchema': {
                'payload': 'string',
                's3': {
                    's3BucketName': 'string',
                    's3ObjectKey': 'string'
                }
            },
            'description': 'string',
            'functionSchema': {
                'functions': [
                    {
                        'description': 'string',
                        'name': 'string',
                        'parameters': {
                            'string': {
                                'description': 'string',
                                'required': True|False,
                                'type': 'string'|'number'|'integer'|'boolean'|'array'
                            }
                        },
                        'requireConfirmation': 'ENABLED'|'DISABLED'
                    },
                ]
            },
            'parentActionGroupSignature': 'AMAZON.UserInput'|'AMAZON.CodeInterpreter'
        },
    ],
    bedrockModelConfigurations={
        'performanceConfig': {
            'latency': 'standard'|'optimized'
        }
    },
    customerEncryptionKeyArn='string',
    enableTrace=True|False,
    endSession=True|False,
    foundationModel='string',
    guardrailConfiguration={
        'guardrailIdentifier': 'string',
        'guardrailVersion': 'string'
    },
    idleSessionTTLInSeconds=123,
    inlineSessionState={
        'files': [
            {
                'name': 'string',
                'source': {
                    'byteContent': {
                        'data': b'bytes',
                        'mediaType': 'string'
                    },
                    's3Location': {
                        'uri': 'string'
                    },
                    'sourceType': 'S3'|'BYTE_CONTENT'
                },
                'useCase': 'CODE_INTERPRETER'|'CHAT'
            },
        ],
        'invocationId': 'string',
        'promptSessionAttributes': {
            'string': 'string'
        },
        'returnControlInvocationResults': [
            {
                'apiResult': {
                    'actionGroup': 'string',
                    'agentId': 'string',
                    'apiPath': 'string',
                    'confirmationState': 'CONFIRM'|'DENY',
                    'httpMethod': 'string',
                    'httpStatusCode': 123,
                    'responseBody': {
                        'string': {
                            'body': 'string'
                        }
                    },
                    'responseState': 'FAILURE'|'REPROMPT'
                },
                'functionResult': {
                    'actionGroup': 'string',
                    'agentId': 'string',
                    'confirmationState': 'CONFIRM'|'DENY',
                    'function': 'string',
                    'responseBody': {
                        'string': {
                            'body': 'string'
                        }
                    },
                    'responseState': 'FAILURE'|'REPROMPT'
                }
            },
        ],
        'sessionAttributes': {
            'string': 'string'
        }
    },
    inputText='string',
    instruction='string',
    knowledgeBases=[
        {
            'description': 'string',
            'knowledgeBaseId': 'string',
            'retrievalConfiguration': {
                'vectorSearchConfiguration': {
                    'filter': {
                        'andAll': [
                            {'... recursive ...'},
                        ],
                        'equals': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'greaterThan': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'greaterThanOrEquals': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'in': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'lessThan': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'lessThanOrEquals': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'listContains': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'notEquals': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'notIn': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'orAll': [
                            {'... recursive ...'},
                        ],
                        'startsWith': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        },
                        'stringContains': {
                            'key': 'string',
                            'value': {...}|[...]|123|123.4|'string'|True|None
                        }
                    },
                    'implicitFilterConfiguration': {
                        'metadataAttributes': [
                            {
                                'description': 'string',
                                'key': 'string',
                                'type': 'STRING'|'NUMBER'|'BOOLEAN'|'STRING_LIST'
                            },
                        ],
                        'modelArn': 'string'
                    },
                    'numberOfResults': 123,
                    'overrideSearchType': 'HYBRID'|'SEMANTIC',
                    'rerankingConfiguration': {
                        'bedrockRerankingConfiguration': {
                            'metadataConfiguration': {
                                'selectionMode': 'SELECTIVE'|'ALL',
                                'selectiveModeConfiguration': {
                                    'fieldsToExclude': [
                                        {
                                            'fieldName': 'string'
                                        },
                                    ],
                                    'fieldsToInclude': [
                                        {
                                            'fieldName': 'string'
                                        },
                                    ]
                                }
                            },
                            'modelConfiguration': {
                                'additionalModelRequestFields': {
                                    'string': {...}|[...]|123|123.4|'string'|True|None
                                },
                                'modelArn': 'string'
                            },
                            'numberOfRerankedResults': 123
                        },
                        'type': 'BEDROCK_RERANKING_MODEL'
                    }
                }
            }
        },
    ],
    promptOverrideConfiguration={
        'overrideLambda': 'string',
        'promptConfigurations': [
            {
                'basePromptTemplate': 'string',
                'inferenceConfiguration': {
                    'maximumLength': 123,
                    'stopSequences': [
                        'string',
                    ],
                    'temperature': ...,
                    'topK': 123,
                    'topP': ...
                },
                'parserMode': 'DEFAULT'|'OVERRIDDEN',
                'promptCreationMode': 'DEFAULT'|'OVERRIDDEN',
                'promptState': 'ENABLED'|'DISABLED',
                'promptType': 'PRE_PROCESSING'|'ORCHESTRATION'|'KNOWLEDGE_BASE_RESPONSE_GENERATION'|'POST_PROCESSING'|'ROUTING_CLASSIFIER'
            },
        ]
    },
   sessionId='string',
+  streamingConfigurations={
+      'applyGuardrailInterval': 123,
+      'streamFinalResponse': True|False
+  }
)

https://awsapichanges.com/archive/changes/a77c18-bedrock-agent-runtime.html

やってみる

それでは実際に、以下のコードでストリーミング処理をしてみます。森田の書いたコードを参考にさせていただきました。

https://dev.classmethod.jp/articles/agents-bedrock-inlineagents/

トレース部分はアップデート前後で変わらないため、最終的な Output 部分をストリーミングするようにしてみました。

main.py
import boto3
from uuid import uuid4
from pprint import pprint

session_id = str(uuid4())

bedrock_agent_runtime = boto3.client('bedrock-agent-runtime', region_name='us-west-2')


inputText = """

x = 2*3
print(x)

日本語で、実行結果とともに処理内容を解説してください。
"""

response = bedrock_agent_runtime.invoke_inline_agent(
    sessionId=session_id,
    # Input
    inputText=inputText,
    endSession=False,
    enableTrace=True,

    # Agent configurations
    foundationModel='anthropic.claude-3-haiku-20240307-v1:0',
    instruction="あなたは、ユーザの代わりにコードを実行するエージェントです。ユーザから入力されたコードをCodeInterpreterActionを使って実行します。",
    actionGroups=[
        {
            'actionGroupName': 'CodeInterpreterAction',
            'parentActionGroupSignature': 'AMAZON.CodeInterpreter'
        }
    ],
+   streamingConfigurations={
+       'streamFinalResponse': True
+   },
)

- print("Trace:")
- for event in response['completion']:
-     if 'trace' in event:
-         pprint(event['trace']['trace']['orchestrationTrace'])
-     if 'chunk' in event:
-         break
print("------")
print("Output:")
+ for event in response['completion']:
+     if 'chunk' in event:
+         print(event['chunk']['bytes'].decode('utf-8'), end='')

うまくストリーミング生成されていることがわかりますね。

2025-01-17 at 23.24.03-main.py — agents_inline_streaming.gif

まとめ

以上、簡単ではございましたが「Amzon Bedrock Agents の InvokeInlineAgent API がストリーミング生成をサポートしました。」でした。

InvokeInlineAgent API をなんとなく知ってはいたのですが、こんなに簡単に Agents を体験できるのはクセになりますね。

このブログが参考になれば幸いです。

クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.